package com.yidu.CashManagement.util;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author 苏彬
 * @date 2022/12/10 20:28
 **/
public class CreateId {
    /**
     * 锁对象,可以为任意对象
     */
    private static Object FundsAllot = "FundsAllot";
    /**
     * 订单号生成计数器
     */
    private static long orderNumCount = 0L;
    /**
     * 每毫秒生成订单号数量最大值
     */
    private static int maxPerMSECSize = 999;

    /**
     * 生成非重复订单号,理论上限1毫秒1000个,可扩展
     *
     * @param name 测试用
     */
    public static String createId(String name) {
        // 最终生成的订单号
        String finOrderNum = "";
        try {
            synchronized (FundsAllot) {
                // 取系统当前时间作为订单号变量前半部分,精确到毫秒
                long nowLong = Long.parseLong(new SimpleDateFormat("yyyyMMddmmssSSS").format(new Date()));
                // 计数器到最大值归零,可扩展更大,目前1毫秒处理峰值1000个,1秒100万
                if (orderNumCount > maxPerMSECSize) {
                    orderNumCount = 0L;
                }
                //组装订单号
                if (orderNumCount < 10) {
                    finOrderNum = nowLong + "00" + orderNumCount;
                }
                if (orderNumCount > 9 && orderNumCount < 100) {
                    finOrderNum = nowLong + "0" + orderNumCount;
                }
                if (orderNumCount > 99) {
                    finOrderNum = nowLong + "" + orderNumCount;
                }
                orderNumCount++;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return name+finOrderNum;
    }
}
